package ru.mirent.console.colors;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import ru.mirent.console.colors.BgColor;
import ru.mirent.console.colors.BC;
import ru.mirent.console.colors.FormatterTextColor;
import ru.mirent.console.colors.TC;

/**
 * Тест и пример для класса {@link FormatterTextColor} - форматирования текста при выводе в консоль IDE.
 */
public class FormatterTextColorTest {

    @Test
    void textColorTest() {
        System.out.printf("%n");
        String expected = "\u001B[31mТекст с буквами красного цвета \u001B[39mБез форматирования\u001B[0m";
        FormatterTextColor formatterTextColor = new FormatterTextColor();
        String actual = formatterTextColor
                .startTextColor(TC.RED)
                .append("Текст с буквами красного цвета ")
                .stopTextColor().append("Без форматирования")
                .build();

        System.out.println(actual);
        Assertions.assertEquals(expected, actual);
    }

    @Test
    void backgroundColorTest() {
        System.out.printf("%n");
        String expected = "\u001B[41mТекст с фоном красного цвета \u001B[49mБез форматирования\u001B[0m";
        FormatterTextColor formatterTextColor = new FormatterTextColor();
        String actual = formatterTextColor.startBackgroundColor(BgColor.create(BC.RED))
                .append("Текст с фоном красного цвета ")
                .stopBackgroundColor()
                .append("Без форматирования")
                .build();

        System.out.println(actual);
        Assertions.assertEquals(expected, actual);
    }

    @Test
    void multipleAttributesTest() {
        System.out.printf("%n");
        String expected = "Без форматирования \u001B[31mТекст красного цвета \u001B[103mТекст красного цвета и со светло желтым фоном \u001B[39mТекст цвета по умолчанию и со светло желтым фоном \u001B[0mБез форматирования";
        FormatterTextColor formatterTextColor = new FormatterTextColor();
        String actual = formatterTextColor
                .append("Без форматирования ")
                .startTextColor(TC.RED)
                .append("Текст красного цвета ")
                .startBackgroundColor(BgColor.create(BC.YELLOW_BRIGHT))
                .append("Текст красного цвета и со светло желтым фоном ")
                .stopTextColor()
                .append("Текст цвета по умолчанию и со светло желтым фоном ")
                .defaultFormat()
                .append("Без форматирования")
                .build();

        System.out.println(actual);
        Assertions.assertEquals(expected, actual);
    }

    @Test
    void sequenceAttributesTest() {
        System.out.printf("%n");
        String expected = "\u001B[31;103mТекст красного цвета и со светло желтым фоном \u001B[34;102mТекст синего цвета и со светло зеленым фоном\u001B[0m";
        FormatterTextColor formatterTextColor = new FormatterTextColor();
        String actual = formatterTextColor
                .startTextColor(TC.RED)
                .startBackgroundColor(BgColor.create(BC.YELLOW_BRIGHT))
                .append("Текст красного цвета и со светло желтым фоном ")
                .startTextColor(TC.BLUE)
                .startBackgroundColor(BgColor.create(BC.GREEN_BRIGHT))
                .append("Текст синего цвета и со светло зеленым фоном")
                .build();

        System.out.println(actual);
        Assertions.assertEquals(expected, actual);
    }

    @Test
    void textAfterDefaultFormatTest() {
        System.out.printf("%n");
        String expected = "\u001B[31;103mТекст красного цвета и со светло желтым фоном \u001B[0mТекст без форматирования для проверки корректного завершения строки";
        FormatterTextColor formatterTextColor = new FormatterTextColor();
        String actual = formatterTextColor
                .startTextColor(TC.RED)
                .startBackgroundColor(BgColor.create(BC.YELLOW_BRIGHT))
                .append("Текст красного цвета и со светло желтым фоном ")
                .build().concat("Текст без форматирования для проверки корректного завершения строки");

        System.out.println(actual);
        Assertions.assertEquals(expected, actual);
    }

    @Test
    void callDefaultFormatTest() {
        System.out.printf("%n");
        String expected = "\u001B[31;103mТекст красного цвета и со светло желтым фоном\u001B[0m";
        FormatterTextColor formatterTextColor = new FormatterTextColor();
        String actual = formatterTextColor
                .startTextColor(TC.RED)
                .startBackgroundColor(BgColor.create(BC.YELLOW_BRIGHT))
                .append("Текст красного цвета и со светло желтым фоном")
                .defaultFormat()
                .defaultFormat()
                .build();

        System.out.println(actual);
        Assertions.assertEquals(expected, actual);
    }

    @Test
    void defaultFormatWithoutFormattingTest() {
        System.out.printf("%n");
        String expected = "Без форматирования для проверки добавления закрывающего формат блока\u001B[0m";
        FormatterTextColor formatterTextColor = new FormatterTextColor();
        String actual = formatterTextColor
                .append("Без форматирования для проверки добавления закрывающего формат блока")
                .build();

        System.out.println(actual);
        Assertions.assertEquals(expected, actual);
    }
}
